/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.core;

/**
 *
 * @author marcelo
 */
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Helper {
    
    private static Boolean MODO_DESARROLLO = GlobalContext.getInstance().isModoDesarrollo();
    public static enum FUNCION {CREATE, UPDATE,DEFAULT};
    
    
    private static SessionFactory sessionFactory;
//        static {
//            try {
//                sessionFactory = initBBDD(FUNCION.DEFAULT);
//            } catch (HibernateException he) {
//                //Mapping Exception debe recrear
//                Throwable t = he.getCause();
//                GlobalContext.getInstance().Logger().printError(he);
//                throw he;
//            }
//    }
        
//    public static Session createSession() {
//        return sessionFactory.openSession();
//    }
    
    public static Session currentSession() {
        if (sessionFactory == null) {
            sessionFactory = initBBDD(FUNCION.DEFAULT);
        }
        return sessionFactory.getCurrentSession();
    }
    
    /**
     * Este metodo debe recrear la base de datos e insertar los datos dentro de ella
     * Una opcion buena seria que primero intente construir la session
     * si encuentra un error y dependiendo del tipo de error haga lo siguiente
     * si no encontro ninguna tabla que EJECUTE CREATE
     * si encontro las tablas pero tiene errores entonces que EJECUTE UPDATE
     * =====================================================================
     * @return SessionFactory si pudo crear la session, sino retorna <strong>null</strong>
     * 
     */
    protected static SessionFactory initBBDD(FUNCION funcion){
        Configuration config;
        if (MODO_DESARROLLO) {
            config = new Configuration().configure("develop_hibernate.cfg.xml");
        }
        else {
            config = new Configuration().configure();
        }
        switch (funcion) {
            case CREATE:
                config.getProperties().setProperty("hibernate.hbm2ddl.auto", "create");
                break;
            case UPDATE:
                config.getProperties().setProperty("hibernate.hbm2ddl.auto", "update");
                break;
            default: break;
        }
        try{
            return config.buildSessionFactory();
        }
        catch(HibernateException he) {
            GlobalContext.getInstance().Logger().printError(he);
            return null;
        }
    }
    
   
}
